home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / zmc3v078 / zmc3v078.lzh / SRCSV078.LZH / PORTAMNT.C < prev    next >
C/C++ Source or Header  |  2000-02-27  |  5KB  |  224 lines

  1. /* ==========================================
  2.      @ series (@v, @b, @r, ... ) conversion
  3.      and... many subroutines
  4.    ========================================== */
  5.  
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "etc.h"
  11. #include "makezmd2.h"
  12. #include "makezmd3.h"
  13. #include "parsesub.h"
  14. #include "velo.h"
  15. #include "68lib.h"
  16.  
  17. #include "structs.h"
  18. #include "structs2.h"
  19. UBYTE *makePortament(UBYTE *zms,TRKCHINF *trkdata, const BYTE target[],
  20.                         TRKINF *trkinf,COMMONINF *cominf,const char endchar);
  21. UBYTE *makeZmdAutoPortament(UBYTE *zms, TRKCHINF *trkdata,
  22.                         TRKINF *trkinf, const BYTE target[]);
  23. UBYTE *makeZmdAutoPortamentSwitch(UBYTE *zms, TRKCHINF *trkdata, const BYTE target[]);
  24.  
  25.  
  26. extern DWORD line;
  27. extern char *linebuf;
  28. extern LINEDATA *ld;
  29.  
  30. UBYTE *makePortament(UBYTE *zms,TRKCHINF *trkdata, const BYTE target[],
  31.                         TRKINF *trkinf,COMMONINF *cominf, const char endchar)
  32. {
  33.     LINEDATA *ld_ = ld;
  34.     UBYTE *linebuf_ = linebuf;
  35.     UBYTE *zms_ = zms;
  36.     int trk;
  37.  
  38.     for (trk = 0; target[trk] >= 0; trk++) {
  39.         const int Trk = target[trk];
  40.         UBYTE note[9];
  41.         VELOETCVAR v[9];
  42.         UWORD step_, gate_, gate0;
  43.         WORD delay = trkinf[Trk].pdelay;
  44.         WORD ptime = trkinf[Trk].ptime;
  45.         BYTE *qpos = &(trkinf[Trk].quantizepos);
  46.         int notes;
  47.         BYTE relvelo = 0;
  48.         WORD br,add,cor,velo = -1;
  49.         /* const BYTE vnum = trkinf[Trk].veloznum; */
  50.  
  51.         ld = ld_;
  52.  
  53.         zms = makePortChord(zms_,Trk,trkinf,cominf,
  54.                     endchar,1,v,note,¬es,
  55.                     &step_,&gate_,&gate0,&delay,&ptime);
  56.         if (notes != 2) {
  57.             /* zmserror("portament requires 2 tones.",line_,linebuf_,zms_,0,1); */
  58.             if (checkCommonCommand(zms_,notes,note,step_,ld_->line,linebuf_,cominf)) {
  59.                 return zms;        /* if (d0) || (d1), return at once */
  60.             }
  61.         } else if (delay < 0) {
  62.             zmserror("delay must not be under zero.",ld_->line,linebuf_,zms_,0,1);
  63.         } else if (!step_) {
  64.             zmserror("illegal step length.",ld_->line,linebuf_,zms,0,1);
  65.         }
  66.  
  67.         {        /* add v0.72 */
  68.             int i, p = -1;
  69.             for (i = 0; i < 2; i++) {
  70.                 if (v[i].relflg[0] != 2) {
  71.                     p = i;
  72.                     break;
  73.                 }
  74.             }
  75.             if (p == -1) {
  76.                 relvelo = setVelo(trkdata,Trk,trkinf,cominf,step_,&velo);        /* velocity set */
  77.             } else {
  78.                 /* setVelo0(trkdata,Trk,v[p],&relvelo,trkinf,cominf,step_); */
  79.                 setVelo0(trkdata,Trk,v[p],&relvelo,trkinf,cominf,step_);
  80.             }
  81.         }
  82.  
  83.         /*velo = setVelo0(trkdata,Trk,v[notes - 1],&relvelo,trkinf,cominf,step_);*/
  84.         relvelo = setVelo(trkdata,Trk,trkinf,cominf,step_,&velo);        /* velocity set */
  85.         if (velo < 0) {        /* no velocity == use default */
  86.             velo = 0x80;
  87.         }
  88.         if (trkinf[Trk].veloseqsw) {
  89.             vSeqLoopChk(Trk,trkinf);
  90.         }
  91.  
  92.         *trkdata[Trk].zmd++ = endchar == ')'? 0x84 : 0x85;
  93. /*
  94.         if (delay != trkinf[Trk].pdelay) {
  95.             note[0] += 0x80;
  96.             trkinf[Trk].pdelay = delay;
  97.         }
  98. */
  99.         if ((trkinf[Trk].pdelay = delay) != 0) {
  100.             note[0] += 0x80;
  101.         }
  102.         *trkdata[Trk].zmd++ = note[0];
  103. /*
  104.         if (ptime != trkinf[Trk].ptime) {
  105.             note[1] += 0x80;
  106.             trkinf[Trk].ptime = ptime;
  107.         }
  108. */
  109.         if ((trkinf[Trk].ptime = ptime) != 0) {
  110.             note[1] += 0x80;
  111.             trkinf[Trk].ptime = ptime;
  112.         }
  113.         *trkdata[Trk].zmd++ = note[1];
  114.  
  115.         if (note[0] >= 0x80) {
  116.             trkdata[Trk].zmd += putZvar(trkdata[Trk].zmd, delay);
  117.         }
  118.         if (note[1] >= 0x80) {
  119.             trkdata[Trk].zmd += putZvar(trkdata[Trk].zmd, ptime);
  120.         }
  121.  
  122.         if (step_) {
  123.             checkRenpu(trkdata,Trk,trkinf,1);
  124.         }
  125.         incrementStepCounters(&trkinf[Trk], step_);
  126.  
  127.         trkdata[Trk].zmd += putStepGate(trkdata[Trk].zmd, trkinf[Trk].r->prev,
  128.                                         step_,gate_);
  129.         if (relvelo < 0) {
  130.             *trkdata[Trk].zmd++ = velo;
  131.         } else if (relvelo > 0) {
  132.             *trkdata[Trk].zmd++ = velo + 192;
  133.         } else {
  134.             *trkdata[Trk].zmd++ = 0x80;
  135.         }
  136.  
  137.         if (++*qpos >= trkinf[Trk].quantizenum) {
  138.             *qpos = 0;
  139.         }
  140.     }
  141.     return zms;
  142. }
  143.  
  144.  
  145.  
  146. UBYTE *makeZmdAutoPortament(UBYTE *zms, TRKCHINF *trkdata,
  147.                         TRKINF *trkinf, const BYTE target[])
  148. {
  149.     int trk;
  150.     LINEDATA *ld_ = ld;
  151.     UBYTE *linebuf_ = linebuf;
  152.     UBYTE *zms_ = zms;
  153.  
  154.     for (trk = 0; target[trk] >= 0; trk++) {
  155.         const int Trk = target[trk];
  156.         const char *p[] = {"off","on",NULL};
  157.         DWORD para[2] = {0, 0};
  158.         int err, i;
  159.         UBYTE sw = 0, swmask = 0x80;
  160.  
  161.         ld    = ld_;
  162.         zms     = zms_;
  163.         linebuf = linebuf_;
  164.  
  165.         zms = getnum4(zms,¶[0],&err, p, 0);
  166.         zms = skipSpc(zms);
  167.         if (err) {
  168.             para[0] = -1;
  169.         }
  170.         *trkdata[Trk].zmd++ = 0xF6;
  171.         *trkdata[Trk].zmd++ = para[0];
  172.  
  173.         for (i = 0; i < 2; i++) {
  174.             if (*zms == ',') {
  175.                 zms++;
  176.             }
  177.             zms = getnum2(zms,¶[i],&err);
  178.             zms = skipSpc(zms);
  179.             if (!err) {
  180.                 sw |= swmask;
  181.             }
  182.             swmask >>= 1;
  183.         }
  184.  
  185.         *trkdata[Trk].zmd++ = sw;
  186.         swmask = 0x80;
  187.         for (i = 0; i < 2; i++) {
  188.             if (sw & swmask) {
  189.                 putWord(trkdata[Trk].zmd, para[i]);
  190.                 trkdata[Trk].zmd += 2;
  191.             }
  192.             swmask >>= 1;
  193.         }
  194.     }
  195.  
  196.     return zms;
  197. }
  198.  
  199.  
  200.  
  201.  
  202.  
  203. UBYTE *makeZmdAutoPortamentSwitch(UBYTE *zms, TRKCHINF *trkdata, const BYTE target[])
  204.                                                 /* [auto_portament.switch] */
  205. {
  206.     int trk, err;
  207.     DWORD para;
  208.     const char *p[] = {"off","on",NULL};
  209.  
  210.     zms = getnum4(zms,¶,&err, p, 0);
  211.     if (!err) {
  212.         for (trk = 0; target[trk] >= 0; trk++) {
  213.             const int Trk = target[trk];
  214.             *trkdata[Trk].zmd++ = 0xf6;
  215.             *trkdata[Trk].zmd++ = para;
  216.             *trkdata[Trk].zmd++ = 0;
  217.         }
  218.     } else {
  219.         zmserror("[AUTO_PORTAMENT.SWITCH] require its parameter.",line,linebuf,zms,4,1);
  220.     }
  221.  
  222.     return zms;
  223. }
  224.